/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/ 

#include "../Comun/Clase.h"
#include "../Comun/Condiciones.h"
#include "../Comun/Archivo.h"
#include "CapaConsulta.h"
#include "InterpreteUsuario.h"
#include "AdministradorDeOperaciones.h"
#include "AdministradorMetadata.h"

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;
using namespace CapaConsulta;
using namespace Comun;

int main(int argc, char* argv[])
{
	if (argc != 2)
	{
		string param = "";
		if (argc > 1)
			param = argv[1];
		if (argc != 3 || param != "-i")
		{
			cout << "Modo de uso: CapaConsulta operaciones.sql" << endl;
			cout << "             CapaConsulta -i \"{comando sql a ejecutar}\"" << endl;

#ifdef WIN32
			system("del /Q *.tmp");
#else
			system("rm -f *.tmp");
#endif

			return 1;
		}
		else
		{
			stringstream entradaPorTexto;
			entradaPorTexto << argv[2];

			try
			{
				CapaConsulta::Aplicacion::Correr(&entradaPorTexto);
			}
			catch (exception)
			{
#ifdef WIN32
				system("del /Q *.tmp");
#else
				system("rm -f *.tmp");
#endif		
				return 1;
			}

#ifdef WIN32
			system("del /Q *.tmp");
#else
			system("rm -f *.tmp");
#endif			
			return 0;
		}
	}

	string pathArchivo = argv[1];
	ifstream archivoEntrada(pathArchivo.c_str());

	if (!archivoEntrada.bad())
	{
		stringstream entrada;
		entrada << archivoEntrada.rdbuf();
		archivoEntrada.close();

		/*try
		{*/
			CapaConsulta::Aplicacion::Correr(&entrada);
	/*	}
		catch (exception e)
		{
#ifdef WIN32
			system("del -Q *.tmp");
#else
			system("rm -f *.tmp");
#endif			
			return 1;
		}*/
	}
	else
	{
		cout << "No se puede abrir " << argv[1] << endl;
#ifdef WIN32
		system("del /Q *.tmp");
#else
		system("rm -f *.tmp");
#endif		
		return 1;
	}

#ifdef WIN32
	system("del /Q *.tmp");
#else
	system("rm -f *.tmp");
#endif	
	return 0;
}

namespace CapaConsulta
{

	void Aplicacion::Correr(stringstream* entrada)
	{
		InterpreteUsuario::EjecutarOperaciones(entrada);
	};

}


//int main(int argc, char* argv[])
//{
//
//	Seleccion* s = new Seleccion();
//
//	Join j;
//	
//	j.From.NombreAtributo = "apellido";
//	j.From.NombreClase ="Persona";
//	
//	j.ClaseJoin.NombreAtributo = "apellido";
//	j.ClaseJoin.NombreClase ="Clientes";
//
//	s->Joins->push_back(j);
//	
//	Atributo* a = new Atributo();
//	a->Nombre = "DNI";
//	a->Tipo = Entero;
//	a->Valor = "0";
//
//	CondicionCompuestaAND* cand = new CondicionCompuestaAND();
//	CondicionMayor* igual = new CondicionMayor();
//	igual->ValorCondicion = *a;
//	igual->NombreClase = "Persona";
//	cand->Subcondiciones.push_back(igual);
//	s->Condiciones = cand;	
//
//	ClaseAtributo ca1;
//	ca1.NombreAtributo = "sueldo";
//	ca1.NombreClase ="Persona";
//	ClaseAtributo ca2;
//	ca2.NombreAtributo = "nombre";
//	ca2.NombreClase ="Persona";
//	ClaseAtributo ca3;
//	ca3.NombreAtributo = "apellido";
//	ca3.NombreClase ="Persona";
//	ClaseAtributo ca4;
//	ca4.NombreAtributo = "IdCliente";
//	ca4.NombreClase ="Clientes";
//
//	s->CamposSeleccionConClase->push_back(ca1);
//	s->CamposSeleccionConClase->push_back(ca2);
//	s->CamposSeleccionConClase->push_back(ca3);	
//	s->CamposSeleccionConClase->push_back(ca4);
//
//	a = new Atributo();
//	a->Nombre = "sueldo";
//	a->Tipo = Real;
//
//	AdministradorMetadata* am = new AdministradorMetadata("Persona");
//	
//	s->ClaseOperacion = am->ClaseMetadata;
//	
//
//	s->OrdernarPor = a;
//
//	s->Ejecutar();
//	
//}

//int main(int argc, char* argv[])
//{
//
//	Actualizacion* b = new Actualizacion();
//	AdministradorMetadata* am1 = new AdministradorMetadata("Persona");
//	
//	b->ClaseOperacion = am1->ClaseMetadata;
//	
//	Atributo* a = new Atributo();
//	a->Nombre = "DNI";
//	a->Tipo = Entero;
//	a->Valor = "31555000";
//
//	ClaveValor cv;
//	cv.Clave ="nombre";
//	cv.Valor ="Perogrullo";
//	b->Valores->push_back(cv);
//
//	CondicionCompuestaAND* cand = new CondicionCompuestaAND();
//	CondicionIgual* igual = new CondicionIgual();
//	igual->ValorCondicion = *a;
//	cand->Subcondiciones.push_back(igual);
//	b->Condiciones = cand;	
//
//	b->Ejecutar();
//	
//}

//int main(int argc, char* argv[])
//{
//
//	Borrado* b = new Borrado();
//	AdministradorMetadata* am1 = new AdministradorMetadata("Persona");
//	
//	b->ClaseOperacion = am1->ClaseMetadata;
//	
//	Atributo* a = new Atributo();
//	a->Nombre = "DNI";
//	a->Tipo = Entero;
//	a->Valor = "31555001";
//
//	CondicionCompuestaAND* cand = new CondicionCompuestaAND();
//	CondicionIgual* igual = new CondicionIgual();
//	igual->ValorCondicion = *a;
//	cand->Subcondiciones.push_back(igual);
//	b->Condiciones = cand;	
//
//	b->Ejecutar();
//	
//}

/*int main(int argc, char* argv[])
{

CrearClase* cc = new CrearClase();
cc->PathArchivoCreacion = new string("AltaDeClase0.txt");
cc->Ejecutar();

cc->PathArchivoCreacion = new string("AltaDeClase.txt");
cc->Ejecutar();

}*/

//int main(int argc, char* argv[])
//{
//	CrearClase* cc = new CrearClase();
//	cc->PathArchivoCreacion = new string("AltaDeClase0.txt");
//	cc->Ejecutar();
//
//	cc->PathArchivoCreacion = new string("AltaDeClase.txt");
//	cc->Ejecutar();
//
//	AdministradorMetadata* am1 = new AdministradorMetadata("Persona");
//	AdministradorMetadata* am2 = new AdministradorMetadata("Clientes");
//
//	Insercion* i = new Insercion();
//
//	string* ss = new string[5];
//	ss[0] = "Perez";
//	ss[1] = "Juan";
//	ss[2] = "31555000";
//	ss[3] = "23/02/1985";
//	ss[4] = "1024.12";
//
//	int off = 0;
//	
//	for (IteradorDeAtributos a = am1->ClaseMetadata->Miembros->begin();a != am1->ClaseMetadata->Miembros->end();a++)
//	{
//		ClaveValor cv;
//		cv.Clave = a->Nombre;
//		cv.Valor = ss[off++];
//		i->Valores->push_back(cv);
//	}
//
//	i->ClaseOperacion = am1->ClaseMetadata;
//	i->Ejecutar();
//
//	 i = new Insercion();
//
//	ss = new string[5];
//	ss[0] = "Perez";
//	ss[1] = "0";
//	ss[2] = "125";	
//
//	off = 0;
//	
//	for (IteradorDeAtributos a = am2->ClaseMetadata->Miembros->begin();a != am2->ClaseMetadata->Miembros->end();a++)
//	{
//		ClaveValor cv;
//		cv.Clave = a->Nombre;
//		cv.Valor = ss[off++];
//		i->Valores->push_back(cv);
//	}
//
//	i->ClaseOperacion = am2->ClaseMetadata;
//	i->Ejecutar();
//
//	i = new Insercion();
//
//	ss = new string[5];
//	ss[0] = "Sanchez";
//	ss[1] = "Oscar";
//	ss[2] = "31555001";
//	ss[3] = "23/02/1986";
//	ss[4] = "1824.00";
//
//off = 0;
//	
//	for (IteradorDeAtributos a = am1->ClaseMetadata->Miembros->begin();a != am1->ClaseMetadata->Miembros->end();a++)
//	{
//		ClaveValor cv;
//		cv.Clave = a->Nombre;
//		cv.Valor = ss[off++];
//		i->Valores->push_back(cv);
//	}
//
//	i->ClaseOperacion = am1->ClaseMetadata;
//	i->Ejecutar();
//
//	 i = new Insercion();
//
//	ss = new string[5];
//	ss[0] = "Sanchez";
//	ss[1] = "1";
//	ss[2] = "29";	
//
//	off = 0;
//	
//	for (IteradorDeAtributos a = am2->ClaseMetadata->Miembros->begin();a != am2->ClaseMetadata->Miembros->end();a++)
//	{
//		ClaveValor cv;
//		cv.Clave = a->Nombre;
//		cv.Valor = ss[off++];
//		i->Valores->push_back(cv);
//	}
//
//	i->ClaseOperacion = am2->ClaseMetadata;
//	i->Ejecutar();
//
//	i = new Insercion();
//
//	ss = new string[5];
//	ss[0] = "Sanchez";
//	ss[1] = "Ruben";
//	ss[2] = "32666001";
//	ss[3] = "23/03/1980";
//	ss[4] = "666.00";
//
//	off = 0;
//	
//	for (IteradorDeAtributos a = am1->ClaseMetadata->Miembros->begin();a != am1->ClaseMetadata->Miembros->end();a++)
//	{
//		ClaveValor cv;
//		cv.Clave = a->Nombre;
//		cv.Valor = ss[off++];
//		i->Valores->push_back(cv);
//	}
//
//	i->ClaseOperacion = am1->ClaseMetadata;
//	i->Ejecutar();
//
//	 i = new Insercion();
//
//	
//
//	
//}

